From 923963268693f985fc1631648aa622f21921be79 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Thu, 20 Nov 2003 11:24:01 +0000 Subject: [PATCH] bitkeeper revision 1.616 (3fbca451cCh4CiAzcPFCijGwNS4Bjg) Many files: Mods to new xclib. Makefile: new file Rename: tools/xc/Makefile -> tools/xc/lib/Makefile rpm.spec: Rename: tools/xc/rpm.spec -> tools/xc/lib/rpm.spec xc.h: Rename: tools/xc/xc.h -> tools/xc/lib/xc.h libxc_private.h: Rename: tools/xc/libxc_private.h -> tools/xc/lib/libxc_private.h libxc_vif.c: Rename: tools/xc/libxc_vif.c -> tools/xc/lib/libxc_vif.c libxc_vbd.c: Rename: tools/xc/libxc_vbd.c -> tools/xc/lib/libxc_vbd.c libxc_private.c: Rename: tools/xc/libxc_private.c -> tools/xc/lib/libxc_private.c libxc_misc.c: Rename: tools/xc/libxc_misc.c -> tools/xc/lib/libxc_misc.c libxc_linux_save.c: Rename: tools/xc/libxc_linux_save.c -> tools/xc/lib/libxc_linux_save.c libxc_linux_restore.c: Rename: tools/xc/libxc_linux_restore.c -> tools/xc/lib/libxc_linux_restore.c libxc_linux_build.c: Rename: tools/xc/libxc_linux_build.c -> tools/xc/lib/libxc_linux_build.c libxc_domain.c: Rename: tools/xc/libxc_domain.c -> tools/xc/lib/libxc_domain.c libxc_bvtsched.c: Rename: tools/xc/libxc_bvtsched.c -> tools/xc/lib/libxc_bvtsched.c Many files: mvdir --- .rootkeys | 27 ++-- tools/Makefile | 6 +- tools/libxc/xc.h | 99 ------------ tools/xc/Makefile | 9 ++ tools/{libxc => xc/lib}/Makefile | 14 +- tools/{libxc => xc/lib}/libxc_bvtsched.c | 10 +- tools/{libxc => xc/lib}/libxc_domain.c | 27 ++-- tools/{libxc => xc/lib}/libxc_linux_build.c | 141 +++++++++--------- tools/{libxc => xc/lib}/libxc_linux_restore.c | 74 +++++---- tools/{libxc => xc/lib}/libxc_linux_save.c | 60 +++++--- tools/{libxc => xc/lib}/libxc_misc.c | 26 +--- tools/{libxc => xc/lib}/libxc_private.c | 21 ++- tools/{libxc => xc/lib}/libxc_private.h | 40 +++-- tools/{libxc => xc/lib}/libxc_vbd.c | 28 ++-- tools/{libxc => xc/lib}/libxc_vif.c | 15 +- tools/{libxc => xc/lib}/rpm.spec | 0 tools/xc/lib/xc.h | 127 ++++++++++++++++ 17 files changed, 402 insertions(+), 322 deletions(-) delete mode 100644 tools/libxc/xc.h create mode 100644 tools/xc/Makefile rename tools/{libxc => xc/lib}/Makefile (72%) rename tools/{libxc => xc/lib}/libxc_bvtsched.c (74%) rename tools/{libxc => xc/lib}/libxc_domain.c (72%) rename tools/{libxc => xc/lib}/libxc_linux_build.c (75%) rename tools/{libxc => xc/lib}/libxc_linux_restore.c (86%) rename tools/{libxc => xc/lib}/libxc_linux_save.c (86%) rename tools/{libxc => xc/lib}/libxc_misc.c (54%) rename tools/{libxc => xc/lib}/libxc_private.c (56%) rename tools/{libxc => xc/lib}/libxc_private.h (72%) rename tools/{libxc => xc/lib}/libxc_vbd.c (79%) rename tools/{libxc => xc/lib}/libxc_vif.c (79%) rename tools/{libxc => xc/lib}/rpm.spec (100%) create mode 100644 tools/xc/lib/xc.h diff --git a/.rootkeys b/.rootkeys index bbdd90398d..5cdfe639ed 100644 --- a/.rootkeys +++ b/.rootkeys @@ -184,19 +184,6 @@ 3fb01fd5B-UeibZkmSCOUZckNyNFYA tools/internal/xi_vbd_list.c 3f86be322bd0h9jG3krZFOUgCDoxZg tools/internal/xi_vif_params.c 3eb781fd7211MZsLxJSiuy7W4KnJXg tools/internal/xi_vifinit -3fbba6dbDfYvJSsw9500b4SZyUhxjQ tools/libxc/Makefile -3fbba6dbEVkVMX0JuDFzap9jeaucGA tools/libxc/libxc_bvtsched.c -3fbba6dbasJQV-MVElDC0DGSHMiL5w tools/libxc/libxc_domain.c -3fbba6dbNCU7U6nsMYiXzKkp3ztaJg tools/libxc/libxc_linux_build.c -3fbba6dbl267zZOAVHYLOdLCdhcZMw tools/libxc/libxc_linux_restore.c -3fbba6db7li3FJiABYtCmuGxOJxEGw tools/libxc/libxc_linux_save.c -3fbba6db7WnnJr0KFrIFrqNlSKvFYg tools/libxc/libxc_misc.c -3fbba6dctWRWlFJkYb6hdix2X4WMuw tools/libxc/libxc_private.c -3fbba6dcbVrG2hPzEzwdeV_UC8kydQ tools/libxc/libxc_private.h -3fbba6dcoGq9hQlksrBUfC2P5F6sGg tools/libxc/libxc_vbd.c -3fbba6dc38q-ioRlwSR_quw4G3qUeQ tools/libxc/libxc_vif.c -3fbba6dc1uU7U3IFeF6A-XEOYF2MkQ tools/libxc/rpm.spec -3fbba6dcrNxtygEcgJYAJJ1gCQqfsA tools/libxc/xc.h 3f776bd2Xd-dUcPKlPN2vG89VGtfvQ tools/misc/Makefile 3f6dc136ZKOjd8PIqLbFBl_v-rnkGg tools/misc/miniterm/Makefile 3f6dc140C8tAeBfroAF24VrmCS4v_w tools/misc/miniterm/README @@ -211,6 +198,20 @@ 3f13d81e6Z6806ihYYUw8GVKNkYnuw tools/misc/xen_nat_enable.README 3f1668d4F29Jsw0aC0bJEIkOBiagiQ tools/misc/xen_read_console.c 3f87ba90EUVPQLVOlFG0sW89BCwouQ tools/misc/xen_refresh_dev.c +3fbca441SjQr8vJwTQIgH1laysaWog tools/xc/Makefile +3fbba6dbDfYvJSsw9500b4SZyUhxjQ tools/xc/lib/Makefile +3fbba6dbEVkVMX0JuDFzap9jeaucGA tools/xc/lib/libxc_bvtsched.c +3fbba6dbasJQV-MVElDC0DGSHMiL5w tools/xc/lib/libxc_domain.c +3fbba6dbNCU7U6nsMYiXzKkp3ztaJg tools/xc/lib/libxc_linux_build.c +3fbba6dbl267zZOAVHYLOdLCdhcZMw tools/xc/lib/libxc_linux_restore.c +3fbba6db7li3FJiABYtCmuGxOJxEGw tools/xc/lib/libxc_linux_save.c +3fbba6db7WnnJr0KFrIFrqNlSKvFYg tools/xc/lib/libxc_misc.c +3fbba6dctWRWlFJkYb6hdix2X4WMuw tools/xc/lib/libxc_private.c +3fbba6dcbVrG2hPzEzwdeV_UC8kydQ tools/xc/lib/libxc_private.h +3fbba6dcoGq9hQlksrBUfC2P5F6sGg tools/xc/lib/libxc_vbd.c +3fbba6dc38q-ioRlwSR_quw4G3qUeQ tools/xc/lib/libxc_vif.c +3fbba6dc1uU7U3IFeF6A-XEOYF2MkQ tools/xc/lib/rpm.spec +3fbba6dcrNxtygEcgJYAJJ1gCQqfsA tools/xc/lib/xc.h 3f72f1bdJPsV3JCnBqs9ddL9tr6D2g xen/COPYING 3f841450eJvqAD1Dldc0_aOweGiglQ xen/GUEST_CHANGES 3ddb79bcbOVHh38VJzc97-JEGD4dJQ xen/Makefile diff --git a/tools/Makefile b/tools/Makefile index 2e46cf66e6..42c579823b 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -21,20 +21,20 @@ all: $(MAKE) -C balloon $(MAKE) -C control $(MAKE) -C internal - $(MAKE) -C libxc + $(MAKE) -C xc $(MAKE) -C misc install: all $(MAKE) -C balloon install $(MAKE) -C control install $(MAKE) -C internal install - $(MAKE) -C libxc install + $(MAKE) -C xc install $(MAKE) -C misc install clean: $(MAKE) -C balloon clean $(MAKE) -C control clean $(MAKE) -C internal clean - $(MAKE) -C libxc clean + $(MAKE) -C xc clean $(MAKE) -C misc clean diff --git a/tools/libxc/xc.h b/tools/libxc/xc.h deleted file mode 100644 index 73934ada6b..0000000000 --- a/tools/libxc/xc.h +++ /dev/null @@ -1,99 +0,0 @@ -/****************************************************************************** - * xc.h - * - * A library for low-level access to the Xen control interfaces. - * - * Copyright (c) 2003, K A Fraser. - */ - -#ifndef __XC_H__ -#define __XC_H__ - -int xc_interface_open(void); -int xc_interface_close(void); - -typedef struct { - unsigned int domid; - unsigned int cpu; - int has_cpu; - int stopped; - unsigned long nr_pages; - unsigned long long cpu_time; -#define XC_DOMINFO_MAXNAME 16 - char name[XC_DOMINFO_MAXNAME]; -} xc_dominfo_t; - -int xc_domain_create(unsigned int mem_kb, const char *name); -int xc_domain_start(unsigned int domid); -int xc_domain_stop(unsigned int domid); -int xc_domain_destroy(unsigned int domid, int force); -int xc_domain_getinfo(unsigned int first_domid, - unsigned int max_doms, - xc_dominfo_t *info); - -int xc_linux_save(unsigned int domid, const char *state_file, int verbose); -int xc_linux_restore(const char *state_file, int verbose); -int xc_linux_build(unsigned int domid, - const char *image_name, - const char *ramdisk_name, - const char *cmdline, - int verbose); - -int xc_bvtsched_global_set(unsigned long ctx_allow); -int xc_bvtsched_domain_set(unsigned int domid, - unsigned long mcuadv, - unsigned long warp, - unsigned long warpl, - unsigned long warpu); - -typedef struct { - unsigned long credit_bytes; - unsigned long credit_usec; -} xc_vif_sched_params_t; - -typedef struct { - unsigned long long tx_bytes, tx_pkts; - unsigned long long rx_bytes, rx_pkts; -} xc_vif_stats_t; - -int xc_vif_scheduler_set(unsigned int domid, - unsigned int vifid, - xc_vif_sched_params_t *params); -int xc_vif_scheduler_get(unsigned int domid, - unsigned int vifid, - xc_vif_sched_params_t *params); -int xc_vif_stats_get(unsigned int domid, - unsigned int vifid, - xc_vif_stats_t *stats); - -typedef struct { -#define XC_VBDDOM_PROBE_ALL (~0U) - unsigned int domid; - unsigned short vbdid; -#define XC_VBDF_WRITEABLE (1<<0) - unsigned long flags; - unsigned long nr_sectors; -} xc_vbd_t; - - -int xc_vbd_create(unsigned int domid, unsigned short vbdid, int writeable); -int xc_vbd_destroy(unsigned int domid, unsigned short vbdid); -int xc_vbd_add_extent(unsigned int domid, - unsigned short vbdid, - unsigned short real_device, - unsigned long start_sector, - unsigned long nr_sectors); -int xc_vbd_delete_extent(unsigned int domid, - unsigned short vbdid, - unsigned short real_device, - unsigned long start_sector, - unsigned long nr_sectors); -int xc_vbd_probe(unsigned int domid, - unsigned short vbdid, - unsigned int max_vbds, - xc_vbd_t *vbds); - -int xc_readconsolering(char *str, unsigned int max_chars, int clear); - - -#endif /* __XC_H__ */ diff --git a/tools/xc/Makefile b/tools/xc/Makefile new file mode 100644 index 0000000000..81bd394484 --- /dev/null +++ b/tools/xc/Makefile @@ -0,0 +1,9 @@ + +all: + $(MAKE) -C lib + +install: + $(MAKE) -C lib install + +clean: + $(MAKE) -C lib xlean diff --git a/tools/libxc/Makefile b/tools/xc/lib/Makefile similarity index 72% rename from tools/libxc/Makefile rename to tools/xc/lib/Makefile index 7bc64e2199..24121c9418 100644 --- a/tools/libxc/Makefile +++ b/tools/xc/lib/Makefile @@ -1,7 +1,7 @@ CC = gcc CFLAGS = -c -Wall -O3 -CFLAGS += -I../../xen/include -I../../xenolinux-sparse/include +CFLAGS += -I../../../xen/include -I../../../xenolinux-sparse/include HDRS = $(wildcard *.h) OBJS = $(patsubst %.c,%.o,$(wildcard libxc_*.c)) @@ -20,12 +20,12 @@ check-for-zlib: fi install: all - mkdir -p ../../../install/lib - mkdir -p ../../../install/include - cp -a $(LIBS) ../../../install/lib - for i in $(LIBS) do ; chmod 755 ../../../install/bin/$i ; done - cp -a xc.h ../../../install/include - chmod 644 ../../../install/include/xc.h + mkdir -p ../../../../install/lib + mkdir -p ../../../../install/include + cp -a $(LIBS) ../../../../install/lib + for i in $(LIBS) do ; chmod 755 ../../../../install/bin/$i ; done + cp -a xc.h ../../../../install/include + chmod 644 ../../../../install/include/xc.h clean: $(RM) *.a *.so *.o *.rpm $(LIBS) diff --git a/tools/libxc/libxc_bvtsched.c b/tools/xc/lib/libxc_bvtsched.c similarity index 74% rename from tools/libxc/libxc_bvtsched.c rename to tools/xc/lib/libxc_bvtsched.c index 5230e96d2f..f7d5b2659e 100644 --- a/tools/libxc/libxc_bvtsched.c +++ b/tools/xc/lib/libxc_bvtsched.c @@ -8,15 +8,17 @@ #include "libxc_private.h" -int xc_bvtsched_global_set(unsigned long ctx_allow) +int xc_bvtsched_global_set(int xc_handle, + unsigned long ctx_allow) { dom0_op_t op; op.cmd = DOM0_BVTCTL; op.u.bvtctl.ctx_allow = ctx_allow; - return do_dom0_op(&op); + return do_dom0_op(xc_handle, &op); } -int xc_bvtsched_domain_set(unsigned int domid, +int xc_bvtsched_domain_set(int xc_handle, + unsigned int domid, unsigned long mcuadv, unsigned long warp, unsigned long warpl, @@ -29,5 +31,5 @@ int xc_bvtsched_domain_set(unsigned int domid, op.u.adjustdom.warp = warp; op.u.adjustdom.warpl = warpl; op.u.adjustdom.warpu = warpu; - return do_dom0_op(&op); + return do_dom0_op(xc_handle, &op); } diff --git a/tools/libxc/libxc_domain.c b/tools/xc/lib/libxc_domain.c similarity index 72% rename from tools/libxc/libxc_domain.c rename to tools/xc/lib/libxc_domain.c index a6c2906e43..93881d17f1 100644 --- a/tools/libxc/libxc_domain.c +++ b/tools/xc/lib/libxc_domain.c @@ -8,7 +8,9 @@ #include "libxc_private.h" -int xc_domain_create(unsigned int mem_kb, const char *name) +int xc_domain_create(int xc_handle, + unsigned int mem_kb, + const char *name) { int err; dom0_op_t op; @@ -18,40 +20,45 @@ int xc_domain_create(unsigned int mem_kb, const char *name) strncpy(op.u.createdomain.name, name, MAX_DOMAIN_NAME); op.u.createdomain.name[MAX_DOMAIN_NAME-1] = '\0'; - err = do_dom0_op(&op); + err = do_dom0_op(xc_handle, &op); return (err < 0) ? err : op.u.createdomain.domain; } -int xc_domain_start(unsigned int domid) +int xc_domain_start(int xc_handle, + unsigned int domid) { dom0_op_t op; op.cmd = DOM0_STARTDOMAIN; op.u.startdomain.domain = domid; - return do_dom0_op(&op); + return do_dom0_op(xc_handle, &op); } -int xc_domain_stop(unsigned int domid) +int xc_domain_stop(int xc_handle, + unsigned int domid) { dom0_op_t op; op.cmd = DOM0_STOPDOMAIN; op.u.stopdomain.domain = domid; - return do_dom0_op(&op); + return do_dom0_op(xc_handle, &op); } -int xc_domain_destroy(unsigned int domid, int force) +int xc_domain_destroy(int xc_handle, + unsigned int domid, + int force) { dom0_op_t op; op.cmd = DOM0_DESTROYDOMAIN; op.u.destroydomain.domain = domid; op.u.destroydomain.force = !!force; - return do_dom0_op(&op); + return do_dom0_op(xc_handle, &op); } -int xc_domain_getinfo(unsigned int first_domid, +int xc_domain_getinfo(int xc_handle, + unsigned int first_domid, unsigned int max_doms, xc_dominfo_t *info) { @@ -62,7 +69,7 @@ int xc_domain_getinfo(unsigned int first_domid, { op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = next_domid; - if ( do_dom0_op(&op) < 0 ) + if ( do_dom0_op(xc_handle, &op) < 0 ) break; info->domid = op.u.getdomaininfo.domain; info->cpu = op.u.getdomaininfo.processor; diff --git a/tools/libxc/libxc_linux_build.c b/tools/xc/lib/libxc_linux_build.c similarity index 75% rename from tools/libxc/libxc_linux_build.c rename to tools/xc/lib/libxc_linux_build.c index a1e4227913..08966c8283 100644 --- a/tools/libxc/libxc_linux_build.c +++ b/tools/xc/lib/libxc_linux_build.c @@ -12,16 +12,19 @@ #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED) #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -static long get_tot_pages(int domid) +static long get_tot_pages(int xc_handle, int domid) { dom0_op_t op; op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = domid; - return (do_dom0_op(&op) < 0) ? -1 : op.u.getdomaininfo.tot_pages; + return (do_dom0_op(xc_handle, &op) < 0) ? + -1 : op.u.getdomaininfo.tot_pages; } -static int get_pfn_list( - int domid, unsigned long *pfn_buf, unsigned long max_pfns) +static int get_pfn_list(int xc_handle, + int domid, + unsigned long *pfn_buf, + unsigned long max_pfns) { dom0_op_t op; int ret; @@ -33,14 +36,14 @@ static int get_pfn_list( if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 ) return -1; - ret = do_dom0_op(&op); + ret = do_dom0_op(xc_handle, &op); (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long)); return (ret < 0) ? -1 : op.u.getmemlist.num_pfns; } -static int send_pgupdates(mmu_update_t *updates, int nr_updates) +static int send_pgupdates(int xc_handle, mmu_update_t *updates, int nr_updates) { int ret = -1; privcmd_hypercall_t hypercall; @@ -52,7 +55,7 @@ static int send_pgupdates(mmu_update_t *updates, int nr_updates) if ( mlock(updates, nr_updates * sizeof(*updates)) != 0 ) goto out1; - if ( do_xen_hypercall(&hypercall) < 0 ) + if ( do_xen_hypercall(xc_handle, &hypercall) < 0 ) goto out2; ret = 0; @@ -63,15 +66,14 @@ static int send_pgupdates(mmu_update_t *updates, int nr_updates) /* Read the kernel header, extracting the image size and load address. */ static int read_kernel_header(gzFile gfd, long dom_size, - unsigned long *load_addr, int verbose) + unsigned long *load_addr) { char signature[SIG_LEN]; gzread(gfd, signature, SIG_LEN); if ( strncmp(signature, GUEST_SIG, SIG_LEN) ) { - if ( verbose ) - ERROR("Kernel image does not contain required signature"); + ERROR("Kernel image does not contain required signature"); return -1; } @@ -81,21 +83,28 @@ static int read_kernel_header(gzFile gfd, long dom_size, return 0; } -static int copy_to_domain_page(unsigned long dst_pfn, void *src_page) +static int copy_to_domain_page(int pm_handle, + unsigned long dst_pfn, + void *src_page) { - void *vaddr = map_pfn(dst_pfn); + void *vaddr = map_pfn(pm_handle, dst_pfn); if ( vaddr == NULL ) return -1; memcpy(vaddr, src_page, PAGE_SIZE); - unmap_pfn(vaddr); + unmap_pfn(pm_handle, vaddr); return 0; } -static int setup_guestos( - int dom, gzFile kernel_gfd, int initrd_fd, unsigned long tot_pages, - unsigned long *virt_startinfo_addr, unsigned long virt_load_addr, - dom0_builddomain_t *builddomain, const char *cmdline, - unsigned long shared_info_frame, int verbose) +static int setup_guestos(int xc_handle, + int dom, + gzFile kernel_gfd, + int initrd_fd, + unsigned long tot_pages, + unsigned long *virt_startinfo_addr, + unsigned long virt_load_addr, + dom0_builddomain_t *builddomain, + const char *cmdline, + unsigned long shared_info_frame) { l1_pgentry_t *vl1tab = NULL, *vl1e = NULL; l2_pgentry_t *vl2tab = NULL, *vl2e = NULL; @@ -110,10 +119,11 @@ static int setup_guestos( start_info_t *start_info; shared_info_t *shared_info; unsigned long ksize; + int pm_handle; memset(builddomain, 0, sizeof(*builddomain)); - if ( init_pfn_mapper() < 0 ) + if ( (pm_handle = init_pfn_mapper()) < 0 ) goto error_out; pgt_updates = malloc((tot_pages + 1024) * 3 * sizeof(mmu_update_t)); @@ -121,15 +131,13 @@ static int setup_guestos( pgt_update_arr = pgt_updates; if ( (pgt_update_arr == NULL) || (page_array == NULL) ) { - if ( verbose ) - PERROR("Could not allocate memory"); + PERROR("Could not allocate memory"); goto error_out; } - if ( get_pfn_list(dom, page_array, tot_pages) != tot_pages ) + if ( get_pfn_list(xc_handle, dom, page_array, tot_pages) != tot_pages ) { - if ( verbose ) - PERROR("Could not get the page frame list"); + PERROR("Could not get the page frame list"); goto error_out; } @@ -140,17 +148,15 @@ static int setup_guestos( int size; if ( (size = gzread(kernel_gfd, page, PAGE_SIZE)) == -1 ) { - if ( verbose ) - PERROR("Error reading kernel image, could not" - " read the whole image."); + PERROR("Error reading kernel image, could not" + " read the whole image."); goto error_out; } if ( size == 0 ) goto kernel_copied; - copy_to_domain_page(page_array[i>>PAGE_SHIFT], page); + copy_to_domain_page(pm_handle, page_array[i>>PAGE_SHIFT], page); } - if ( verbose ) - ERROR("Kernel too big to safely fit in domain memory"); + ERROR("Kernel too big to safely fit in domain memory"); goto error_out; kernel_copied: @@ -165,15 +171,13 @@ static int setup_guestos( if ( fstat(initrd_fd, &stat) < 0 ) { - if ( verbose ) - PERROR("Could not stat the initrd image"); + PERROR("Could not stat the initrd image"); goto error_out; } isize = stat.st_size; if ( (isize + ksize) > ((tot_pages/2) * PAGE_SIZE) ) { - if ( verbose ) - ERROR("Kernel/initrd too big to safely fit in domain memory"); + ERROR("Kernel/initrd too big to safely fit in domain memory"); goto error_out; } @@ -186,12 +190,11 @@ static int setup_guestos( int size = ((isize-j) < PAGE_SIZE) ? (isize-j) : PAGE_SIZE; if ( read(initrd_fd, page, size) != size ) { - if ( verbose ) - PERROR("Error reading initrd image, could not" - " read the whole image."); + PERROR("Error reading initrd image, could not" + " read the whole image."); goto error_out; } - copy_to_domain_page(page_array[i>>PAGE_SHIFT], page); + copy_to_domain_page(pm_handle, page_array[i>>PAGE_SHIFT], page); } } @@ -224,7 +227,7 @@ static int setup_guestos( num_pgt_updates++; /* Initialise the page tables. */ - if ( (vl2tab = map_pfn(l2tab >> PAGE_SHIFT)) == NULL ) + if ( (vl2tab = map_pfn(pm_handle, l2tab >> PAGE_SHIFT)) == NULL ) goto error_out; memset(vl2tab, 0, PAGE_SIZE); vl2e = vl2tab + l2_table_offset(virt_load_addr); @@ -233,7 +236,7 @@ static int setup_guestos( if ( ((unsigned long)vl1e & (PAGE_SIZE-1)) == 0 ) { l1tab = page_array[alloc_index] << PAGE_SHIFT; - if ( (vl1tab = map_pfn(l1tab >> PAGE_SHIFT)) == NULL ) + if ( (vl1tab = map_pfn(pm_handle, l1tab >> PAGE_SHIFT)) == NULL ) goto error_out; memset(vl1tab, 0, PAGE_SIZE); alloc_index--; @@ -277,7 +280,7 @@ static int setup_guestos( *virt_startinfo_addr = virt_load_addr + ((alloc_index-1) << PAGE_SHIFT); - start_info = map_pfn(page_array[alloc_index-1]); + start_info = map_pfn(pm_handle, page_array[alloc_index-1]); memset(start_info, 0, sizeof(*start_info)); start_info->pt_base = virt_load_addr + ((tot_pages-1) << PAGE_SHIFT); start_info->mod_start = initrd_addr; @@ -289,15 +292,15 @@ static int setup_guestos( strncpy(start_info->cmd_line, cmdline, MAX_CMD_LEN); start_info->cmd_line[MAX_CMD_LEN-1] = '\0'; - unmap_pfn(start_info); + unmap_pfn(pm_handle, start_info); /* shared_info page starts its life empty. */ - shared_info = map_pfn(shared_info_frame); + shared_info = map_pfn(pm_handle, shared_info_frame); memset(shared_info, 0, PAGE_SIZE); - unmap_pfn(shared_info); + unmap_pfn(pm_handle, shared_info); /* Send the page update requests down to the hypervisor. */ - if ( send_pgupdates(pgt_update_arr, num_pgt_updates) < 0 ) + if ( send_pgupdates(xc_handle, pgt_update_arr, num_pgt_updates) < 0 ) goto error_out; free(page_array); @@ -305,6 +308,8 @@ static int setup_guestos( return 0; error_out: + if ( pm_handle >= 0 ) + (void)close_pfn_mapper(pm_handle); if ( page_array == NULL ) free(page_array); if ( pgt_update_arr == NULL ) @@ -312,11 +317,11 @@ static int setup_guestos( return -1; } -int xc_domain_build(unsigned int domid, +int xc_domain_build(int xc_handle, + unsigned int domid, const char *image_name, const char *ramdisk_name, - const char *cmdline, - int verbose) + const char *cmdline) { dom0_op_t launch_op, op; unsigned long load_addr; @@ -327,46 +332,41 @@ int xc_domain_build(unsigned int domid, full_execution_context_t *ctxt; unsigned long virt_startinfo_addr; - if ( (tot_pages = get_tot_pages(domid)) < 0 ) + if ( (tot_pages = get_tot_pages(xc_handle, domid)) < 0 ) { - if ( verbose ) - PERROR("Could not find total pages for domain"); + PERROR("Could not find total pages for domain"); return 1; } kernel_fd = open(image_name, O_RDONLY); if ( kernel_fd < 0 ) { - if ( verbose ) - PERROR("Could not open kernel image"); + PERROR("Could not open kernel image"); return 1; } if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL ) { - if ( verbose ) - PERROR("Could not allocate decompression state for state file"); + PERROR("Could not allocate decompression state for state file"); close(kernel_fd); return 1; } rc = read_kernel_header(kernel_gfd, tot_pages << (PAGE_SHIFT - 10), - &load_addr, verbose); + &load_addr); if ( rc < 0 ) goto error_out; if ( (load_addr & (PAGE_SIZE-1)) != 0 ) { - if ( verbose ) - ERROR("We can only deal with page-aligned load addresses"); + ERROR("We can only deal with page-aligned load addresses"); goto error_out; } if ( (load_addr + (tot_pages << PAGE_SHIFT)) > HYPERVISOR_VIRT_START ) { - if ( verbose ) - ERROR("Cannot map all domain memory without hitting Xen space"); + ERROR("Cannot map all domain memory without hitting Xen space"); goto error_out; } @@ -375,35 +375,32 @@ int xc_domain_build(unsigned int domid, initrd_fd = open(ramdisk_name, O_RDONLY); if ( initrd_fd < 0 ) { - if ( verbose ) - PERROR("Could not open the initial ramdisk image"); + PERROR("Could not open the initial ramdisk image"); goto error_out; } } op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = domid; - if ( (do_dom0_op(&op) < 0) || (op.u.getdomaininfo.domain != domid) ) + if ( (do_dom0_op(xc_handle, &op) < 0) || + (op.u.getdomaininfo.domain != domid) ) { - if ( verbose ) - PERROR("Could not get info on domain"); + PERROR("Could not get info on domain"); goto error_out; } if ( (op.u.getdomaininfo.state != DOMSTATE_STOPPED) || (op.u.getdomaininfo.ctxt.pt_base != 0) ) { - if ( verbose ) - ERROR("Domain is already constructed"); + ERROR("Domain is already constructed"); goto error_out; } - if ( setup_guestos(domid, kernel_gfd, initrd_fd, tot_pages, + if ( setup_guestos(xc_handle, domid, kernel_gfd, initrd_fd, tot_pages, &virt_startinfo_addr, load_addr, &launch_op.u.builddomain, cmdline, - op.u.getdomaininfo.shared_info_frame, verbose) < 0 ) + op.u.getdomaininfo.shared_info_frame) < 0 ) { - if ( verbose ) - ERROR("Error constructing guest OS"); + ERROR("Error constructing guest OS"); goto error_out; } @@ -469,7 +466,7 @@ int xc_domain_build(unsigned int domid, launch_op.u.builddomain.num_vifs = 1; launch_op.cmd = DOM0_BUILDDOMAIN; - rc = do_dom0_op(&launch_op); + rc = do_dom0_op(xc_handle, &launch_op); return rc; diff --git a/tools/libxc/libxc_linux_restore.c b/tools/xc/lib/libxc_linux_restore.c similarity index 86% rename from tools/libxc/libxc_linux_restore.c rename to tools/xc/lib/libxc_linux_restore.c index 6afa2e2df8..e865280b17 100644 --- a/tools/libxc/libxc_linux_restore.c +++ b/tools/xc/lib/libxc_linux_restore.c @@ -18,8 +18,10 @@ fflush(stdout); \ } while ( 0 ) -static int get_pfn_list( - int domain_id, unsigned long *pfn_buf, unsigned long max_pfns) +static int get_pfn_list(int xc_handle, + int domain_id, + unsigned long *pfn_buf, + unsigned long max_pfns) { dom0_op_t op; int ret; @@ -34,7 +36,7 @@ static int get_pfn_list( return -1; } - ret = do_dom0_op(&op); + ret = do_dom0_op(xc_handle, &op); (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long)); @@ -43,7 +45,8 @@ static int get_pfn_list( #define MAX_MMU_UPDATES 1024 -static int flush_mmu_updates(mmu_update_t *mmu_updates, +static int flush_mmu_updates(int xc_handle, + mmu_update_t *mmu_updates, int *mmu_update_idx) { int err = 0; @@ -63,7 +66,7 @@ static int flush_mmu_updates(mmu_update_t *mmu_updates, goto out; } - if ( do_xen_hypercall(&hypercall) < 0 ) + if ( do_xen_hypercall(xc_handle, &hypercall) < 0 ) { ERROR("Failure when submitting mmu updates"); err = 1; @@ -77,7 +80,8 @@ static int flush_mmu_updates(mmu_update_t *mmu_updates, return err; } -static int add_mmu_update(mmu_update_t *mmu_updates, +static int add_mmu_update(int xc_handle, + mmu_update_t *mmu_updates, int *mmu_update_idx, unsigned long ptr, unsigned long val) @@ -85,7 +89,7 @@ static int add_mmu_update(mmu_update_t *mmu_updates, mmu_updates[*mmu_update_idx].ptr = ptr; mmu_updates[*mmu_update_idx].val = val; if ( ++*mmu_update_idx == MAX_MMU_UPDATES ) - return flush_mmu_updates(mmu_updates, mmu_update_idx); + return flush_mmu_updates(xc_handle, mmu_updates, mmu_update_idx); return 0; } @@ -97,7 +101,9 @@ static int checked_read(gzFile fd, void *buf, size_t count) return rc == count; } -int xc_linux_restore(const char *state_file, int verbose) +int xc_linux_restore(int xc_handle, + const char *state_file, + int verbose) { dom0_op_t op; int rc = 1, i, j; @@ -142,6 +148,8 @@ int xc_linux_restore(const char *state_file, int verbose) mmu_update_t mmu_updates[MAX_MMU_UPDATES]; int mmu_update_idx = 0; + int pm_handle = -1; + if ( (fd = open(state_file, O_RDONLY)) == -1 ) { PERROR("Could not open state file for reading"); @@ -210,7 +218,7 @@ int xc_linux_restore(const char *state_file, int verbose) op.cmd = DOM0_CREATEDOMAIN; op.u.createdomain.memory_kb = nr_pfns * (PAGE_SIZE / 1024); memcpy(op.u.createdomain.name, name, MAX_DOMAIN_NAME); - if ( do_dom0_op(&op) < 0 ) + if ( do_dom0_op(xc_handle, &op) < 0 ) { ERROR("Could not create new domain"); goto out; @@ -220,23 +228,23 @@ int xc_linux_restore(const char *state_file, int verbose) /* Get the domain's shared-info frame. */ op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = dom; - if ( do_dom0_op(&op) < 0 ) + if ( do_dom0_op(xc_handle, &op) < 0 ) { ERROR("Could not get information on new domain"); goto out; } shared_info_frame = op.u.getdomaininfo.shared_info_frame; - if ( init_pfn_mapper() < 0 ) + if ( (pm_handle = init_pfn_mapper()) < 0 ) goto out; /* Copy saved contents of shared-info page. No checking needed. */ - ppage = map_pfn(shared_info_frame); + ppage = map_pfn(pm_handle, shared_info_frame); memcpy(ppage, shared_info, PAGE_SIZE); - unmap_pfn(ppage); + unmap_pfn(pm_handle, ppage); /* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */ - if ( get_pfn_list(dom, pfn_to_mfn_table, nr_pfns) != nr_pfns ) + if ( get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns ) { ERROR("Did not read correct number of frame numbers for new dom"); goto out; @@ -266,12 +274,12 @@ int xc_linux_restore(const char *state_file, int verbose) goto out; } - ppage = map_pfn(mfn); + ppage = map_pfn(pm_handle, mfn); switch ( pfn_type[i] ) { case L1TAB: memset(ppage, 0, PAGE_SIZE); - if ( add_mmu_update(mmu_updates, &mmu_update_idx, + if ( add_mmu_update(xc_handle, mmu_updates, &mmu_update_idx, (mfn< i ) { - unsigned long **l1 = map_pfn(pfn_to_mfn_table[pfn]); + unsigned long **l1 = map_pfn(pm_handle, + pfn_to_mfn_table[pfn]); memset(l1, 0, PAGE_SIZE); - unmap_pfn(l1); + unmap_pfn(pm_handle, l1); } page[j] &= (PAGE_SIZE - 1) & ~(_PAGE_GLOBAL | _PAGE_PSE); page[j] |= pfn_to_mfn_table[pfn] << PAGE_SHIFT; } - if ( add_mmu_update(mmu_updates, &mmu_update_idx, + if ( add_mmu_update(xc_handle, mmu_updates, &mmu_update_idx, (unsigned long)&ppage[j], page[j]) ) goto out; } @@ -337,16 +346,16 @@ int xc_linux_restore(const char *state_file, int verbose) break; } /* NB. Must flush before unmapping page, as pass VAs to Xen. */ - if ( flush_mmu_updates(mmu_updates, &mmu_update_idx) ) + if ( flush_mmu_updates(xc_handle, mmu_updates, &mmu_update_idx) ) goto out; - unmap_pfn(ppage); + unmap_pfn(pm_handle, ppage); - if ( add_mmu_update(mmu_updates, &mmu_update_idx, + if ( add_mmu_update(xc_handle, mmu_updates, &mmu_update_idx, (mfn<resume_info.nr_pages = nr_pfns; p_srec->resume_info.shared_info = shared_info_frame << PAGE_SHIFT; p_srec->resume_info.dom_id = dom; p_srec->resume_info.flags = 0; - unmap_pfn(p_srec); + unmap_pfn(pm_handle, p_srec); /* Uncanonicalise each GDT frame number. */ if ( ctxt.gdt_ents > 8192 ) @@ -403,9 +412,9 @@ int xc_linux_restore(const char *state_file, int verbose) ERROR("PFN-to-MFN frame number is bad"); goto out; } - ppage = map_pfn(pfn_to_mfn_table[pfn]); + ppage = map_pfn(pm_handle, pfn_to_mfn_table[pfn]); memcpy(ppage, &pfn_to_mfn_table[i], copy_size); - unmap_pfn(ppage); + unmap_pfn(pm_handle, ppage); } /* @@ -446,7 +455,7 @@ int xc_linux_restore(const char *state_file, int verbose) op.u.builddomain.domain = dom; op.u.builddomain.num_vifs = 1; memcpy(&op.u.builddomain.ctxt, &ctxt, sizeof(ctxt)); - rc = do_dom0_op(&op); + rc = do_dom0_op(xc_handle, &op); out: if ( rc != 0 ) @@ -456,7 +465,7 @@ int xc_linux_restore(const char *state_file, int verbose) op.cmd = DOM0_DESTROYDOMAIN; op.u.destroydomain.domain = dom; op.u.destroydomain.force = 1; - (void)do_dom0_op(&op); + (void)do_dom0_op(xc_handle, &op); } } else @@ -465,6 +474,9 @@ int xc_linux_restore(const char *state_file, int verbose) verbose_printf("DOM=%ld\n", dom); } + if ( pm_handle >= 0 ) + (void)close_pfn_mapper(pm_handle); + if ( pfn_to_mfn_table != NULL ) free(pfn_to_mfn_table); if ( pfn_type != NULL ) diff --git a/tools/libxc/libxc_linux_save.c b/tools/xc/lib/libxc_linux_save.c similarity index 86% rename from tools/libxc/libxc_linux_save.c rename to tools/xc/lib/libxc_linux_save.c index 77edfc6ae7..0986c96cad 100644 --- a/tools/libxc/libxc_linux_save.c +++ b/tools/xc/lib/libxc_linux_save.c @@ -38,23 +38,26 @@ _res; \ }) -static int check_pfn_ownership(unsigned long mfn, unsigned int dom) +static int check_pfn_ownership(int xc_handle, + unsigned long mfn, + unsigned int dom) { dom0_op_t op; op.cmd = DOM0_GETPAGEFRAMEINFO; op.u.getpageframeinfo.pfn = mfn; - if ( (do_dom0_op(&op) < 0) || (op.u.getpageframeinfo.domain != dom) ) + if ( (do_dom0_op(xc_handle, &op) < 0) || + (op.u.getpageframeinfo.domain != dom) ) return 0; return 1; } #define GETPFN_ERR (~0U) -static unsigned int get_pfn_type(unsigned long mfn) +static unsigned int get_pfn_type(int xc_handle, unsigned long mfn) { dom0_op_t op; op.cmd = DOM0_GETPAGEFRAMEINFO; op.u.getpageframeinfo.pfn = mfn; - if ( do_dom0_op(&op) < 0 ) + if ( do_dom0_op(xc_handle, &op) < 0 ) { PERROR("Unexpected failure when getting page frame info!"); return GETPFN_ERR; @@ -70,7 +73,10 @@ static int checked_write(gzFile fd, void *buf, size_t count) return rc == count; } -int xc_linux_save(unsigned int domid, const char *state_file, int verbose) +int xc_linux_save(int xc_handle, + unsigned int domid, + const char *state_file, + int verbose) { dom0_op_t op; int rc = 1, i, j; @@ -112,6 +118,8 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) int fd; gzFile gfd; + int pm_handle = -1; + if ( (fd = open(state_file, O_CREAT|O_EXCL|O_WRONLY, 0644)) == -1 ) { PERROR("Could not open file for writing"); @@ -134,7 +142,8 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) { op.cmd = DOM0_GETDOMAININFO; op.u.getdomaininfo.domain = domid; - if ( (do_dom0_op(&op) < 0) || (op.u.getdomaininfo.domain != domid) ) + if ( (do_dom0_op(xc_handle, &op) < 0) || + (op.u.getdomaininfo.domain != domid) ) { PERROR("Could not get info on domain"); goto out; @@ -151,7 +160,7 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) op.cmd = DOM0_STOPDOMAIN; op.u.stopdomain.domain = domid; - (void)do_dom0_op(&op); + (void)do_dom0_op(xc_handle, &op); sleep(1); } @@ -163,20 +172,20 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) goto out; } - if ( init_pfn_mapper() < 0 ) + if ( (pm_handle = init_pfn_mapper()) < 0 ) goto out; /* Is the suspend-record MFN actually valid for this domain? */ - if ( !check_pfn_ownership(ctxt.i386_ctxt.esi, domid) ) + if ( !check_pfn_ownership(xc_handle, ctxt.i386_ctxt.esi, domid) ) { ERROR("Invalid state record pointer"); goto out; } /* If the suspend-record MFN is okay then grab a copy of it to @srec. */ - p_srec = map_pfn(ctxt.i386_ctxt.esi); + p_srec = map_pfn(pm_handle, ctxt.i386_ctxt.esi); memcpy(&srec, p_srec, sizeof(srec)); - unmap_pfn(p_srec); + unmap_pfn(pm_handle, p_srec); if ( srec.nr_pfns > 1024*1024 ) { @@ -184,16 +193,16 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) goto out; } - if ( !check_pfn_ownership(srec.pfn_to_mfn_frame_list, domid) ) + if ( !check_pfn_ownership(xc_handle, srec.pfn_to_mfn_frame_list, domid) ) { ERROR("Invalid pfn-to-mfn frame list pointer"); goto out; } /* Grab a copy of the pfn-to-mfn table frame list. */ - p_pfn_to_mfn_frame_list = map_pfn(srec.pfn_to_mfn_frame_list); + p_pfn_to_mfn_frame_list = map_pfn(pm_handle, srec.pfn_to_mfn_frame_list); memcpy(pfn_to_mfn_frame_list, p_pfn_to_mfn_frame_list, PAGE_SIZE); - unmap_pfn(p_pfn_to_mfn_frame_list); + unmap_pfn(pm_handle, p_pfn_to_mfn_frame_list); /* We want zeroed memory so use calloc rather than malloc. */ mfn_to_pfn_table = calloc(1, 4 * 1024 * 1024); @@ -221,19 +230,19 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) if ( (i & 1023) == 0 ) { mfn = pfn_to_mfn_frame_list[i/1024]; - if ( !check_pfn_ownership(mfn, domid) ) + if ( !check_pfn_ownership(xc_handle, mfn, domid) ) { ERROR("Invalid frame number if pfn-to-mfn frame list"); goto out; } if ( pfn_to_mfn_frame != NULL ) - unmap_pfn(pfn_to_mfn_frame); - pfn_to_mfn_frame = map_pfn(mfn); + unmap_pfn(pm_handle, pfn_to_mfn_frame); + pfn_to_mfn_frame = map_pfn(pm_handle, mfn); } mfn = pfn_to_mfn_frame[i & 1023]; - if ( !check_pfn_ownership(mfn, domid) ) + if ( !check_pfn_ownership(xc_handle, mfn, domid) ) { ERROR("Invalid frame specified with pfn-to-mfn table"); goto out; @@ -250,7 +259,7 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) mfn_to_pfn_table[mfn] = i; /* Query page type by MFN, but store it by PFN. */ - if ( (pfn_type[i] = get_pfn_type(mfn)) == GETPFN_ERR ) + if ( (pfn_type[i] = get_pfn_type(xc_handle, mfn)) == GETPFN_ERR ) goto out; } @@ -290,7 +299,7 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) } /* Start writing out the saved-domain record. */ - ppage = map_pfn(shared_info_frame); + ppage = map_pfn(pm_handle, shared_info_frame); if ( !checked_write(gfd, "XenoLinuxSuspend", 16) || !checked_write(gfd, name, sizeof(name)) || !checked_write(gfd, &srec.nr_pfns, sizeof(unsigned long)) || @@ -302,7 +311,7 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) ERROR("Error when writing to state file"); goto out; } - unmap_pfn(ppage); + unmap_pfn(pm_handle, ppage); verbose_printf("Saving memory pages: 0%%"); @@ -319,9 +328,9 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) mfn = pfn_to_mfn_table[i]; - ppage = map_pfn(mfn); + ppage = map_pfn(pm_handle, mfn); memcpy(page, ppage, PAGE_SIZE); - unmap_pfn(ppage); + unmap_pfn(pm_handle, ppage); if ( (pfn_type[i] == L1TAB) || (pfn_type[i] == L2TAB) ) { @@ -360,11 +369,14 @@ int xc_linux_save(unsigned int domid, const char *state_file, int verbose) { op.cmd = DOM0_STARTDOMAIN; op.u.startdomain.domain = domid; - (void)do_dom0_op(&op); + (void)do_dom0_op(xc_handle, &op); } gzclose(gfd); + if ( pm_handle >= 0 ) + (void)close_pfn_mapper(pm_handle); + if ( pfn_to_mfn_table != NULL ) free(pfn_to_mfn_table); if ( mfn_to_pfn_table != NULL ) diff --git a/tools/libxc/libxc_misc.c b/tools/xc/lib/libxc_misc.c similarity index 54% rename from tools/libxc/libxc_misc.c rename to tools/xc/lib/libxc_misc.c index 351fb26671..297f40fe06 100644 --- a/tools/libxc/libxc_misc.c +++ b/tools/xc/lib/libxc_misc.c @@ -6,33 +6,23 @@ #include "libxc_private.h" -int privcmd_fd = -1; - int xc_interface_open(void) { - if ( (privcmd_fd == -1) && - ((privcmd_fd = open("/proc/xeno/privcmd", O_RDWR)) < 0) ) - { - privcmd_fd = -1; - return -1; - } - return 0; + return open("/proc/xeno/privcmd", O_RDWR); } -int xc_interface_close(void) +int xc_interface_close(int xc_handle) { - if ( privcmd_fd != -1 ) - { - close(privcmd_fd); - privcmd_fd = -1; - } - return 0; + return close(xc_handle); } #define CONSOLE_RING_CLEAR 1 -int xc_readconsolering(char *str, unsigned int max_chars, int clear) +int xc_readconsolering(int xc_handle, + char *str, + unsigned int max_chars, + int clear) { int ret; dom0_op_t op; @@ -42,7 +32,7 @@ int xc_readconsolering(char *str, unsigned int max_chars, int clear) op.u.readconsole.count = max_chars; op.u.readconsole.cmd = clear ? CONSOLE_RING_CLEAR : 0; - if ( (ret = do_dom0_op(&op)) > 0 ) + if ( (ret = do_dom0_op(xc_handle, &op)) > 0 ) str[ret] = '\0'; return ret; diff --git a/tools/libxc/libxc_private.c b/tools/xc/lib/libxc_private.c similarity index 56% rename from tools/libxc/libxc_private.c rename to tools/xc/lib/libxc_private.c index c4c9c8b16d..c93bed841f 100644 --- a/tools/libxc/libxc_private.c +++ b/tools/xc/lib/libxc_private.c @@ -6,29 +6,26 @@ #include "libxc_private.h" -static int devmem_fd = -1; - int init_pfn_mapper(void) { - if ( (devmem_fd == -1) && - ((devmem_fd = open("/dev/mem", O_RDWR)) < 0) ) - { - devmem_fd = -1; - return -1; - } - return 0; + return open("/dev/mem", O_RDWR); +} + +int close_pfn_mapper(int pm_handle) +{ + return close(pm_handle); } -void *map_pfn(unsigned long pfn) +void *map_pfn(int pm_handle, unsigned long pfn) { void *vaddr = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, devmem_fd, pfn << PAGE_SHIFT); + MAP_SHARED, pm_handle, pfn << PAGE_SHIFT); if ( vaddr == MAP_FAILED ) return NULL; return vaddr; } -void unmap_pfn(void *vaddr) +void unmap_pfn(int pm_handle, void *vaddr) { (void)munmap(vaddr, PAGE_SIZE); } diff --git a/tools/libxc/libxc_private.h b/tools/xc/lib/libxc_private.h similarity index 72% rename from tools/libxc/libxc_private.h rename to tools/xc/lib/libxc_private.h index d1994f5431..3eb412d436 100644 --- a/tools/libxc/libxc_private.h +++ b/tools/xc/lib/libxc_private.h @@ -66,18 +66,22 @@ typedef struct { unsigned long l2_lo; } l2_pgentry_t; #define PERROR(_m) \ fprintf(stderr, "ERROR: %s (%d = %s)\n", (_m), errno, strerror(errno)) -extern int privcmd_fd; -static inline int do_privcmd(unsigned int cmd, unsigned long data) +static inline int do_privcmd(int xc_handle, + unsigned int cmd, + unsigned long data) { - return ioctl(privcmd_fd, cmd, data); + return ioctl(xc_handle, cmd, data); } -static inline int do_xen_hypercall(privcmd_hypercall_t *hypercall) +static inline int do_xen_hypercall(int xc_handle, + privcmd_hypercall_t *hypercall) { - return do_privcmd(IOCTL_PRIVCMD_HYPERCALL, (unsigned long)hypercall); + return do_privcmd(xc_handle, + IOCTL_PRIVCMD_HYPERCALL, + (unsigned long)hypercall); } -static inline int do_dom0_op(dom0_op_t *op) +static inline int do_dom0_op(int xc_handle, dom0_op_t *op) { int ret = -1; privcmd_hypercall_t hypercall; @@ -88,9 +92,12 @@ static inline int do_dom0_op(dom0_op_t *op) hypercall.arg[0] = (unsigned long)op; if ( mlock(op, sizeof(*op)) != 0 ) + { + PERROR("Could not lock memory for Xen hypercall"); goto out1; + } - if ( (ret = do_xen_hypercall(&hypercall)) < 0 ) + if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 ) { if ( errno == EACCES ) fprintf(stderr, "Dom0 operation failed -- need to" @@ -104,7 +111,7 @@ static inline int do_dom0_op(dom0_op_t *op) out1: return ret; } -static inline int do_network_op(network_op_t *op) +static inline int do_network_op(int xc_handle, network_op_t *op) { int ret = -1; privcmd_hypercall_t hypercall; @@ -113,9 +120,12 @@ static inline int do_network_op(network_op_t *op) hypercall.arg[0] = (unsigned long)op; if ( mlock(op, sizeof(*op)) != 0 ) + { + PERROR("Could not lock memory for Xen hypercall"); goto out1; + } - if ( (ret = do_xen_hypercall(&hypercall)) < 0 ) + if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 ) goto out2; ret = 0; @@ -125,7 +135,7 @@ static inline int do_network_op(network_op_t *op) } -static inline int do_block_io_op(block_io_op_t *op) +static inline int do_block_io_op(int xc_handle, block_io_op_t *op) { int ret = -1; privcmd_hypercall_t hypercall; @@ -134,9 +144,12 @@ static inline int do_block_io_op(block_io_op_t *op) hypercall.arg[0] = (unsigned long)op; if ( mlock(op, sizeof(*op)) != 0 ) + { + PERROR("Could not lock memory for Xen hypercall"); goto out1; + } - if ( do_xen_hypercall(&hypercall) < 0 ) + if ( do_xen_hypercall(xc_handle, &hypercall) < 0 ) goto out2; ret = 0; @@ -149,7 +162,8 @@ static inline int do_block_io_op(block_io_op_t *op) * PFN mapping. */ int init_pfn_mapper(void); -void *map_pfn(unsigned long pfn); -void unmap_pfn(void *vaddr); +int close_pfn_mapper(int pm_handle); +void *map_pfn(int pm_handle, unsigned long pfn); +void unmap_pfn(int pm_handle, void *vaddr); #endif /* __LIBXC_PRIVATE_H__ */ diff --git a/tools/libxc/libxc_vbd.c b/tools/xc/lib/libxc_vbd.c similarity index 79% rename from tools/libxc/libxc_vbd.c rename to tools/xc/lib/libxc_vbd.c index c255f5b29b..64e21f79e8 100644 --- a/tools/libxc/libxc_vbd.c +++ b/tools/xc/lib/libxc_vbd.c @@ -9,28 +9,34 @@ #define _GNU_SOURCE #include "libxc_private.h" -int xc_vbd_create(unsigned int domid, unsigned short vbdid, int writeable) +int xc_vbd_create(int xc_handle, + unsigned int domid, + unsigned short vbdid, + int writeable) { block_io_op_t op; op.cmd = BLOCK_IO_OP_VBD_CREATE; op.u.create_params.domain = domid; op.u.create_params.vdevice = vbdid; op.u.create_params.mode = VBD_MODE_R | (writeable ? VBD_MODE_W : 0); - return do_block_io_op(&op); + return do_block_io_op(xc_handle, &op); } -int xc_vbd_destroy(unsigned int domid, unsigned short vbdid) +int xc_vbd_destroy(int xc_handle, + unsigned int domid, + unsigned short vbdid) { block_io_op_t op; op.cmd = BLOCK_IO_OP_VBD_DELETE; op.u.delete_params.domain = domid; op.u.delete_params.vdevice = vbdid; - return do_block_io_op(&op); + return do_block_io_op(xc_handle, &op); } -int xc_vbd_add_extent(unsigned int domid, +int xc_vbd_add_extent(int xc_handle, + unsigned int domid, unsigned short vbdid, unsigned short real_device, unsigned long start_sector, @@ -43,11 +49,12 @@ int xc_vbd_add_extent(unsigned int domid, op.u.add_params.extent.device = real_device; op.u.add_params.extent.start_sector = start_sector; op.u.add_params.extent.nr_sectors = nr_sectors; - return do_block_io_op(&op); + return do_block_io_op(xc_handle, &op); } -int xc_vbd_delete_extent(unsigned int domid, +int xc_vbd_delete_extent(int xc_handle, + unsigned int domid, unsigned short vbdid, unsigned short real_device, unsigned long start_sector, @@ -60,11 +67,12 @@ int xc_vbd_delete_extent(unsigned int domid, op.u.add_params.extent.device = real_device; op.u.add_params.extent.start_sector = start_sector; op.u.add_params.extent.nr_sectors = nr_sectors; - return do_block_io_op(&op); + return do_block_io_op(xc_handle, &op); } -int xc_vbd_probe(unsigned int domid, +int xc_vbd_probe(int xc_handle, + unsigned int domid, unsigned short vbdid, unsigned int max_vbds, xc_vbd_t *vbds) @@ -87,7 +95,7 @@ int xc_vbd_probe(unsigned int domid, return -ENOMEM; } - ret = do_block_io_op(&op); + ret = do_block_io_op(xc_handle, &op); (void)munlock(xdi->disks, allocsz); diff --git a/tools/libxc/libxc_vif.c b/tools/xc/lib/libxc_vif.c similarity index 79% rename from tools/libxc/libxc_vif.c rename to tools/xc/lib/libxc_vif.c index c9d35e5611..a3e22ea70b 100644 --- a/tools/libxc/libxc_vif.c +++ b/tools/xc/lib/libxc_vif.c @@ -8,7 +8,8 @@ #include "libxc_private.h" -int xc_vif_scheduler_set(unsigned int domid, +int xc_vif_scheduler_set(int xc_handle, + unsigned int domid, unsigned int vifid, xc_vif_sched_params_t *params) { @@ -18,11 +19,12 @@ int xc_vif_scheduler_set(unsigned int domid, netop.u.vif_setparams.vif = vifid; netop.u.vif_setparams.credit_bytes = params->credit_bytes; netop.u.vif_setparams.credit_usec = params->credit_usec; - return do_network_op(&netop); + return do_network_op(xc_handle, &netop); } -int xc_vif_scheduler_get(unsigned int domid, +int xc_vif_scheduler_get(int xc_handle, + unsigned int domid, unsigned int vifid, xc_vif_sched_params_t *params) { @@ -33,7 +35,7 @@ int xc_vif_scheduler_get(unsigned int domid, netop.u.vif_getinfo.domain = domid; netop.u.vif_getinfo.vif = vifid; - if ( (rc = do_network_op(&netop)) >= 0 ) + if ( (rc = do_network_op(xc_handle, &netop)) >= 0 ) { params->credit_bytes = netop.u.vif_getinfo.credit_bytes; params->credit_usec = netop.u.vif_getinfo.credit_usec; @@ -43,7 +45,8 @@ int xc_vif_scheduler_get(unsigned int domid, } -int xc_vif_stats_get(unsigned int domid, +int xc_vif_stats_get(int xc_handle, + unsigned int domid, unsigned int vifid, xc_vif_stats_t *stats) { @@ -54,7 +57,7 @@ int xc_vif_stats_get(unsigned int domid, netop.u.vif_getinfo.domain = domid; netop.u.vif_getinfo.vif = vifid; - if ( (rc = do_network_op(&netop)) >= 0 ) + if ( (rc = do_network_op(xc_handle, &netop)) >= 0 ) { stats->tx_bytes = netop.u.vif_getinfo.total_bytes_sent; stats->tx_pkts = netop.u.vif_getinfo.total_packets_sent; diff --git a/tools/libxc/rpm.spec b/tools/xc/lib/rpm.spec similarity index 100% rename from tools/libxc/rpm.spec rename to tools/xc/lib/rpm.spec diff --git a/tools/xc/lib/xc.h b/tools/xc/lib/xc.h new file mode 100644 index 0000000000..ec8c483ffa --- /dev/null +++ b/tools/xc/lib/xc.h @@ -0,0 +1,127 @@ +/****************************************************************************** + * xc.h + * + * A library for low-level access to the Xen control interfaces. + * + * Copyright (c) 2003, K A Fraser. + */ + +#ifndef __XC_H__ +#define __XC_H__ + +/* Obtain or relinquish a handle on the 'xc' library. */ +int xc_interface_open(void); +int xc_interface_close(int xc_handle); + +typedef struct { + unsigned int domid; + unsigned int cpu; + int has_cpu; + int stopped; + unsigned long nr_pages; + unsigned long long cpu_time; +#define XC_DOMINFO_MAXNAME 16 + char name[XC_DOMINFO_MAXNAME]; +} xc_dominfo_t; + +int xc_domain_create(int xc_handle, + unsigned int mem_kb, + const char *name); +int xc_domain_start(int xc_handle, + unsigned int domid); +int xc_domain_stop(int xc_handle, + unsigned int domid); +int xc_domain_destroy(int xc_handle, + unsigned int domid, + int force); +int xc_domain_getinfo(int xc_handle, + unsigned int first_domid, + unsigned int max_doms, + xc_dominfo_t *info); + +int xc_linux_save(int xc_handle, + unsigned int domid, + const char *state_file, + int verbose); +int xc_linux_restore(int xc_handle, + const char *state_file, int verbose); +int xc_linux_build(int xc_handle, + unsigned int domid, + const char *image_name, + const char *ramdisk_name, + const char *cmdline); + +int xc_bvtsched_global_set(int xc_handle, + unsigned long ctx_allow); +int xc_bvtsched_domain_set(int xc_handle, + unsigned int domid, + unsigned long mcuadv, + unsigned long warp, + unsigned long warpl, + unsigned long warpu); + +typedef struct { + unsigned long credit_bytes; + unsigned long credit_usec; +} xc_vif_sched_params_t; + +typedef struct { + unsigned long long tx_bytes, tx_pkts; + unsigned long long rx_bytes, rx_pkts; +} xc_vif_stats_t; + +int xc_vif_scheduler_set(int xc_handle, + unsigned int domid, + unsigned int vifid, + xc_vif_sched_params_t *params); +int xc_vif_scheduler_get(int xc_handle, + unsigned int domid, + unsigned int vifid, + xc_vif_sched_params_t *params); +int xc_vif_stats_get(int xc_handle, + unsigned int domid, + unsigned int vifid, + xc_vif_stats_t *stats); + +typedef struct { +#define XC_VBDDOM_PROBE_ALL (~0U) + unsigned int domid; + unsigned short vbdid; +#define XC_VBDF_WRITEABLE (1<<0) + unsigned long flags; + unsigned long nr_sectors; +} xc_vbd_t; + + +int xc_vbd_create(int xc_handle, + unsigned int domid, + unsigned short vbdid, + int writeable); +int xc_vbd_destroy(int xc_handle, + unsigned int domid, + unsigned short vbdid); +int xc_vbd_add_extent(int xc_handle, + unsigned int domid, + unsigned short vbdid, + unsigned short real_device, + unsigned long start_sector, + unsigned long nr_sectors); +int xc_vbd_delete_extent(int xc_handle, + unsigned int domid, + unsigned short vbdid, + unsigned short real_device, + unsigned long start_sector, + unsigned long nr_sectors); +int xc_vbd_probe(int xc_handle, + unsigned int domid, + unsigned short vbdid, + unsigned int max_vbds, + xc_vbd_t *vbds); + +int xc_readconsolering(int xc_handle, + char *str, + unsigned int max_chars, + int clear); + + +#endif /* __XC_H__ */ -- 2.30.2